//
//  BytedCertWrapper.h
//  BytedCertIOS
//
//  Created by LiuChundian on 2019/3/24.
//  Copyright © 2019年 bytedance. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "BytedCertUIConfig.h"
#import "BytedCertError.h"
#import "BytedCertTosInfo.h"
#import "BytedCertDefine.h"
#import "BytedCertLoggerProtocol.h"

NS_ASSUME_NONNULL_BEGIN

typedef void (^BytedCertBytedTokenResultBlock)(NSString *_Nullable bytedToken, NSString *_Nullable clientConfig, BytedCertError *_Nullable error);

typedef void (^BytedCertFaceLivenessResultBlock)(NSDictionary *_Nullable data, BytedCertError *_Nullable error);

typedef void (^BytedCertOCRResultBlock)(NSString* name, NSString* identityCode, BytedCertError *_Nullable error);

/// 上传视频回调
/// - Parameters:
///   - bytedToken: 视频对应bytedToken
///   - filePath： 录制的视频文件路径, 失败的话为nil
///   - error: 错误信息，为nil表示成功
typedef void (^BytedCertUploadVideoFinishBlock)(NSString* bytedToken, NSString* filePath, BytedCertError *_Nullable error);

@interface BytedCertWrapper : NSObject

/// 设置 UI 颜色等信息
@property (nonatomic, strong) BytedCertUIConfig *uiConfig;

@property (nonatomic, assign) BOOL isBoe;

// 自定义logger
@property (nonatomic, strong) id<BytedCertLoggerProtocol> logger;

+ (instancetype)sharedInstance;

/// 初始化SDK
/// - Parameters:
///   - stsToken: 使用临时密钥需要传入ststoken, 使用长期密钥可以直接传null
///   - accessKey: 密钥ak
///   - secretAccessKey: 密钥sk
- (void)initSignWithAccessKey:(NSString*)stsToken accessKey:(NSString*)accessKey SecretAccessKey:(NSString*)secretAccessKey DEPRECATED_MSG_ATTRIBUTE("use setupSignWithStsToken:accessKey:secretAccessKey: instead");

/// 初始化SDK
/// - Parameters:
///   - stsToken: 使用临时密钥需要传入ststoken, 使用长期密钥可以直接传null
///   - accessKey: 密钥ak
///   - secretAccessKey: 密钥sk
- (void)setupSignWithStsToken:(NSString*)stsToken accessKey:(NSString*)accessKey secretAccessKey:(NSString*)secretAccessKey;

/// 定制用户协议
/// - Parameters:
///   - title: OCR页用户协议标题
///   - linker: OCR页用户协议链接
- (void)setUserProtocol:(NSString*)title linker:(NSString*)linker;

/// 配置视频上传参数
/// - Parameters:
///   - tosInfo: tos配置
///   - callback: 上传视频结果callback, 注意：返回非主线程
///         bytedToken: 视频对应bytedToken
///         filePath： 录制的视频文件路径, 失败的话为nil
///         error: 错误信息，为nil表示成功
- (void)configRecordeAndUploadParams:(BytedCertTosInfo*)tosInfo callback:(BytedCertUploadVideoFinishBlock) callback;

///  视频上传后回调
/// - Parameters:
///   - filePath: 文件路径
///   - error:  失败信息
- (void)onUpLoadVideoCallBack:(NSString*)filePath error:(BytedCertError *) error;

/// 身份证件ocr识别H5
/// - Parameter callback: OCR结果
///         name 身份证名称
///         identityCode 身份证号
///         error 错误信息，为nil表示成功
- (void)doOCRH5:(BytedCertOCRResultBlock)callback;

/// 获取token
/// - Parameters:
///   - isRefSource: true为有源比对，false为无源比对
///   - params: 活体参数,
///     基础版参数:
///         - BytedCertParamIdentityName： 身份证名称, 有源比对为必传
///         - BytedCertParamIdentityCode： 身份证id，有源比对为必传
///         - BytedCertParamBinaryDataBase64: 无源比对的基准图base64
///         - BytedCertParamMotionList：活体动作列表，以','隔开，例"0,1,2" //0:"眨眼",1:"张嘴",2:"点头",3:"摇头"
///         - BytedCertParamMotionCount：需要的活体动作个数，从motion_list中选择motion_count个，需要小于等于motion_list中的个数
///         - BytedCertParamLivenessTimeout: 端上活体超时时长，可选范围： [5, 60]，默认：10
///         - BytedCertParamFixedMotionList: 固定一定需要下发的动作列表, 取值同motion_list
///         - BytedCertParamMaxLivenessTrial: 端上动作活体最大尝试次数, 可选范围：[1, 100]，默认：10
///     增强版参数:
///         - BytedCertParamIdentityName： 身份证名称, 有源比对为必传
///         - BytedCertParamIdentityCode： 身份证id，有源比对为必传
///         - BytedCertParamBinaryDataBase64: 无源比对的基准图base64
///         - BytedCertParamRiskMotionList：不同风险等级活体动作列表, Dictionary. 选填, 例: {"free":["0", "1", "2", "3"],"low":["0", "1", "2", "3"],"medium":["0", "1", "2", "3"],"high":["0", "1", "2", "3"]} //0:"眨眼",1:"张嘴",2:"点头",3:"摇头"
///         - BytedCertParamRiskMotionCount：不同风险等级需要的活体动作个数， Dictionary. 选填, 例:  {"free":2,"low":2,"medium":3,"high":4}
///         - BytedCertParamRiskFixedMotionList: 不同风险等级固定一定需要下发的动作列表, Dictionary. 选填, 例: {"free":["0", "1", "2", "3"],"low":["0", "1", "2", "3"],"medium":["0", "1", "2", "3"],"high":["0", "1", "2", "3"]}
///         - BytedCertParamRiskLivenessType: 不同风险等级活体动作类型配置, Dictionary. 选填, 例: {"free":"motion","low":"motion","medium":"reflection","high":"reflection"}
///         - BytedCertParamMaxLivenessTrial: 端上动作活体最大尝试次数, 可选范围：[1, 100]，默认：10
///         - BytedCertParamLivenessTimeout: 端上活体超时时长，可选范围： [5, 60]，默认：10
///   - callback: 返回token结果的callback
///         bytedToken:  返回的BytedToken值
///         clientConfig:  客户端配置，需要原样传入到startFaceLive接口中
///         error:  错误信息，为nil表示成功
- (void)startBytedToken:(BOOL)isRefSource
                params:(NSDictionary*) params
            callback:(BytedCertBytedTokenResultBlock)callback;

/// 启动活体+认证
/// - Parameters:
///   - isRefSource: true为有源比对，false为无源比对
///   - bytedToken: 从startBytedToken获取，也可以使用服务端中bytedToken中返回的
///   - clientConfig: 从startBytedToken中获取，也可使用服务端中的bytedToken中返回的
///   - callback: 认证结果
///         data 返回数据   返回数据data格式参考身份认证sdk返回内容说明 中"服务端认证返回数据"章节的'jsonData'字段。注意：这里已把jsonData字符串解析成了NSDictionary格式
///         error 错误信息，为nil表示成功
- (void)startFaceLive:(BOOL)isRefSource
           bytedToken:(NSString*)bytedToken
         clientConfig:(NSString*)clientConfig
             callback:(BytedCertFaceLivenessResultBlock)callback;

/// 启动全流程认证
/// 流程包括OCR+活体检测+身份比对
/// - Parameters:
///   - params: 认证参数
///         ref_source： "1"为有源,"0"为无源，必传，目前只支持有源
///         motion_list：活体动作列表，以','隔开，例"0,1,2" //0:"眨眼",1:"张嘴",2:"点头",3:"摇头"
///         liveness_timeout: 端上活体超时时长，可选范围： [5, 60]，默认：10
///         fixed_motion_list: 固定一定需要下发的动作列表, 取值同motion_list
///         max_liveness_trial: 端上动作活体最大尝试次数, 可选范围：[1, 100]，默认：10
///   - completion: 认证结果
///         data 返回数据   返回数据data格式参考身份认证sdk返回内容说明 中"服务端认证返回数据"章节的'jsonData'字段。注意：这里已把jsonData字符串解析成了NSDictionary格式
///         error 错误信息，为nil表示成功
- (void)beginAuthorizationWithParams:(NSDictionary *)params
                          completion:(BytedCertFaceLivenessResultBlock)completion;

/// 获取SDK信息
/// - sdk_version: sdk版本号
/// - provider: sdk提供方
/// - algo_action_version: 动作识别版本号
- (NSDictionary *)getSDKVersionInfo;

@end

NS_ASSUME_NONNULL_END
